home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0257 / demo.exe / MENGEN.DEM < prev    next >
Text File  |  1992-02-16  |  12KB  |  437 lines

  1. ; ----------------------------
  2. ; MENGEN.DEM   - Demoprogramm für die Routinen aus MENGEN.LIB
  3. ;                (für den A86)
  4. ;
  5. ;                (c) Bernd Schemmer 1990 - 1992
  6. ;                Letzter Update: 15.02.1992
  7. ;
  8. ; Übersetzen:
  9. ;  A86 MENGEN.DEM DEMOS.INC TO MENGEN.COM
  10. ;
  11. ; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
  12. ;          enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
  13. ;          erreichbar sein.
  14. ;
  15. ; ---------------------------
  16.  
  17.          jmp start            ; Daten überspringen
  18.  
  19. logo  db CR,LF
  20.       db 'MENGEN.DEM  - Demoprogramm für die Routinen aus MENGEN.LIB'
  21.       db CR,LF
  22.       db '----------------------------------------------------------'
  23.       db CR,LF
  24.       db CR,LF
  25. GETLENGTH logo
  26.  
  27. ; ----------------------------
  28. ; DefiniereMenge (aus MENGEN.INC übernenommes Macro)
  29. ;
  30. ; Funktion: Definiert die Menge mit dem namen #1 als leere Menge
  31. ;
  32. ; Aufruf: _DefiniereMenge NameDerMenge
  33. ;
  34. _DefiniereMenge MACRO
  35.  #1 dw 16xD dup (0)
  36. #EM
  37.  
  38. ; Definition der Mengen
  39. ;
  40. _DefiniereMenge Menge1
  41. _DefiniereMenge Menge2
  42.  
  43. ; Elemente, die in Menge1 ein übernommen werden sollen
  44. ; (hier die Tasten der 3. Tastaturreihe)
  45. ;
  46. MakeMsg1 Elemente_fuer_Menge1,'qwertzuiopü+QWERTZUIOPÜ*'
  47.  
  48. ; Elemente, die in Menge2 ein übernommen werden sollen
  49. ; (hier alle Ziffern)
  50. ;
  51. MakeMsg1 Elemente_fuer_Menge2,'1','2','3','4','5','6','7','8','9','0'
  52.  
  53. MakeMsg  prompt1,'Bitte drücken Sie eine Taste (ESC = Ende des Tests): '
  54. MakeMsg  msg0,   '---- Testen, ob ein Element in der Menge1 vorhanden ist'
  55. MakeMsg  msg1,   '---- Gedrückte Taste ***ist*** in der Menge1 vorhanden',CR,LF
  56. MakeMsg  msg2,   '---- Gedrückte Taste ***ist nicht*** in der Menge1 vorhanden',CR,LF
  57. MakeMsg  msg4,   '---- Füge der Menge1 die Elemente "y" und "-" zu'
  58. MakeMsg  msg5,   '---- Entferne die Elemente "q" und "+" aus der Menge1'
  59. MakeMsg  msg6,   '---- Lösche die Menge1 ...'
  60. MakeMsg  msg7,   '---- Kopiere die Menge der Kleinbuchstaben in die Menge1'
  61. MakeMsg  msg8,   '---- Bilde die Vereinigungsmenge von Menge1 und der Menge der Zahlen'
  62.  
  63. ; ------------------
  64.  
  65. start:
  66.          call ShowLogo        ; Logo ausgeben und Speicherblock verkleinern
  67.                               ; Inhalte der vordefinierten Mengen ausgeben
  68.          call ShowPreDefMengen
  69.  
  70.                               ; Menge1 bilden
  71.          mov bx,offset Menge1
  72.          mov di,offset Elemente_Fuer_Menge1
  73.          mov cx,Elemente_fuer_Menge1_LENGTH
  74.          call Bilde_Menge
  75.          call ShowMenge1
  76.  
  77.                               ; Menge2 bilden
  78.          mov bx,offset Menge2
  79.          mov di,offset Elemente_Fuer_Menge2
  80.          mov cx,Elemente_fuer_Menge2_LENGTH
  81.          call Bilde_Menge
  82.          call ShowMenge2
  83.  
  84.                               ; Beispiel für die Nutzung von Mengen
  85. l0:
  86.          call ShowMenge1
  87.          WRITE_STRING msg0
  88.          WRITE_STRING prompt1
  89.          mov ah,08
  90.          int 021h             ; Zeichen lesen
  91.  
  92.          cmp al,ESC
  93.          je >l3               ; Ende
  94.  
  95.                               ; Testen, ob das Zeichen in der Menge vorhanden ist
  96.          mov bx,offset Menge1
  97.          call Element_Vorhanden?
  98.          jz >l1               ; Zeichen nicht vorhanden
  99.                               ; Zeichen vorhanden
  100.          WRITE_STRING msg1
  101.          jmp >l2
  102. l1:
  103.          WRITE_STRING msg2
  104. l2:
  105.          jmp l0
  106.  
  107. l3:
  108.          call ShowMenge1
  109.  
  110.          WRITE_STRING msg4
  111.  
  112.          mov bx,offset menge1
  113.          mov al,'y'           ; Hinzufügen eines Elementes
  114.          call add_Element
  115.          mov al,'-'
  116.          call add_Element
  117.  
  118.          call ShowMenge1
  119.  
  120.          WRITE_STRING msg5
  121.          mov bx,offset menge1
  122.          mov al,'q'           ; Entfernen eines Elementes
  123.          call Sub_Element
  124.          mov al,'+'
  125.          call Sub_element
  126.  
  127.          call ShowMenge1
  128.  
  129.          WRITE_STRING msg6
  130.          mov bx,offset menge1 ; Löschen einer Menge
  131.          call Loesche_Menge
  132.  
  133.          call ShowMenge1
  134.  
  135.          WRITE_STRING msg7    ; Kopieren einer Menge
  136.          mov di,offset menge1
  137.          mov bx,offset Menge_Der_Kleinbuchstaben
  138.          call Kopiere_menge
  139.  
  140.          call ShowMenge1
  141.                               ; Bilden der Vereinigungsmenge
  142.          WRITE_STRING msg8
  143.          mov di,offset menge1
  144.          mov bx,offset Menge2
  145.          call Vereinige_Mengen
  146.  
  147.          call ShowMenge1
  148.                               ; Beispiel zur Deklaration von Mengen
  149.                               ; als initialisierte Variablen
  150.          call GetDefaultForAMenge
  151.  
  152.                               ; Beispiele für die Mengenoperationen
  153.          call ShowMengenOperationen
  154.  
  155.          EndProcess 0
  156.  
  157. ; ----------------------------
  158. ; ShowMenge1
  159. ;
  160. ; Funktion: Gibt alle belegten Mengenelemente der Menge1 als ASCII-Zeichen
  161. ;           auf die Standard-Ausgabe aus
  162. ;
  163. MakeMsg1 msg3, 'Inhalt der Menge1: '
  164.  
  165. ShowMenge1:
  166.          WRITE_STRING msg3
  167.          mov bx,offset menge1
  168.          call ShowMenge
  169.          ret
  170.  
  171. ; ----------------------------
  172. ; ShowMenge2
  173. ;
  174. ; Funktion: Gibt alle belegten Mengenelemente der Menge2 als ASCII-Zeichen
  175. ;           auf die Standard-Ausgabe aus
  176. ;
  177. MakeMsg1 msg30,'Inhalt der Menge2: '
  178.  
  179. ShowMenge2:
  180.          WRITE_STRING msg30
  181.          mov bx,offset menge2
  182.          call ShowMenge
  183.          ret
  184.  
  185. ; ----------------------------
  186. ; ShowPreDefMengen
  187. ;
  188. ; Funktion: Gibt die Inhalt der vordefinierten Mengen als ASCII-Zeichen
  189. ;           auf die Standard-Ausgabe aus
  190. ;
  191. MakeMsg1 msg01, 'Inhalt der Menge der Großbuchstaben: '
  192. MakeMsg1 msg02, 'Inhalt der Menge der Kleinbuchstaben: '
  193. MakeMsg1 msg03, 'Inhalt der Menge der aller Buchstaben: '
  194.  
  195. ShowPreDefMengen:
  196.          WRITE_STRING msg01
  197.          mov bx,offset menge_Der_Grossbuchstaben
  198.          call ShowMenge
  199.  
  200.          WRITE_STRING msg02
  201.          mov bx,offset menge_Der_Kleinbuchstaben
  202.          call ShowMenge
  203.  
  204.          WRITE_STRING msg03
  205.          mov bx,offset menge_Der_buchstaben
  206.          call ShowMenge
  207.          ret
  208.  
  209. ; ----------------------------
  210. ; GetDefaultForAMenge
  211. ;
  212. ; Funktion: Demonstriert wie die Voreinstellung für eine Menge
  213. ;           ermittelt werden kann
  214. ;
  215. msg04 db 'Beispiel für die Ermittlung der Belegung einer Menge'
  216.       db CR,LF
  217.       db CR,LF
  218.       db 'Bitte geben Sie die Elemente für die Menge ein: '
  219.       db CR,LF
  220. GETLENGTH msg04
  221.  
  222. MakeMsg msg05, 'Die eingegebene Menge hat folgende Elemente: '
  223.  
  224. msg06 db 'Soll die Menge mit diesen Elementen schon so im Programm'
  225.       db CR,LF
  226.       db 'deklariert werden, so muß dies folgendermaßen geschehen: '
  227.       db CR,LF
  228.       db CR,LF
  229.       db '  menge DW '
  230. s0    db            '00000h,00000h,00000h,00000h,00000h,00000h,00000h,00000h'
  231.       db CR,LF
  232.       db '        DW '
  233. s1    db            '00000h,00000h,00000h,00000h,00000h,00000h,00000h,00000h'
  234.       db CR,LF
  235.       db CR,LF
  236.       db 'Nochmal?'
  237. GETLENGTH msg06
  238.  
  239. _DefiniereMenge bspmenge
  240.  
  241. elementpuffer db 255,256 dup 0          ; Puffer zum Lesen der Elemente
  242.  
  243. GetDefaultForAMenge:
  244.          WRITE_STRING msg04
  245.                               ; Elemente lesen
  246.          mov dx,offset elementpuffer
  247.          mov ah,0Ah
  248.          int 021h
  249.          call ShowCR_LF
  250.                               ; Menge erstellen
  251.          mov bx,offset bspmenge
  252.          mov di,offset elementpuffer+2
  253.          mov cl,[di-1]        ; CL = Anzahl Elemente für die Menge
  254.          call Bilde_Menge
  255.  
  256.          WRITE_STRING msg05
  257.          mov bx,offset bspmenge
  258.          call ShowMenge
  259.  
  260.          mov cx,8             ; Ausgabe des Aufbaus der Menge
  261.          mov di,offset s0+1
  262.          mov si,offset bspmenge
  263. l0:
  264.          lodsw
  265.          call Konvert_AX_To_Hexstring
  266.          add di,3
  267.          loop l0
  268.  
  269.          mov cx,8
  270.          mov di,offset s1+1
  271. l0:
  272.          lodsw
  273.          call Konvert_AX_To_Hexstring
  274.          add di,3
  275.          loop l0
  276.  
  277.          WRITE_STRING msg06
  278.  
  279.          mov ah,08h
  280.          int 021h
  281.          cmp al,'j'
  282.          je >l1
  283.          cmp al,'J'
  284.          je >l1
  285.          ret
  286.  
  287. l1:
  288.          call ShowCR_LF
  289.          mov bx,offset bspmenge
  290.          call Loesche_Menge
  291.          jmp GetDefaultForAMenge
  292.  
  293. ; ----------------------------
  294. ; ShowMengenOperationen
  295. ;
  296. ; Funktion: Beispiele für die Mengen-Operationen
  297. ;
  298.  
  299. BspMenge1 dw 16 dup 0         ; Beispielmenge1
  300. BspMenge2 dw 16 dup 0         ; Beispielmenge2
  301. BspMenge3 dw 16 dup 0         ; Hilfsmenge
  302.  
  303. MakeMsg1 ElementefuerMenge1, '1234567890abcdefg'
  304. MakeMsg1 ElementefuerMenge2, 'ABCDEFGabcdef'
  305.  
  306. MakeMsg1 BspMenge1Msg, '___ Elemente in der BspMenge1: '
  307. MakeMsg1 BspMenge2Msg, '___ Elemente in der BspMenge2: '
  308.  
  309. MakeMsg CreateMsg,  CR,LF,'---- Erstelle die Mengen BspMenge1 und BspMenge2 ...'
  310. MakeMsg NegMsg,     '---- Negiere die Menge BspMenge1 ...'
  311. MakeMsg ORMsg,      '---- Bilde die Vereinigungsmenge von BspMenge1 und BspMenge2 ...'
  312. MakeMsg ANDMsg,     '---- Bilde die Schnittmenge von BspMenge1 und BspMenge2 ...'
  313. MakeMsg XORMsg,     '---- Bilde die XOR-Menge von BspMenge1 und BspMenge2 ...'
  314.  
  315. ShowMengenOperationen:
  316.          Write_String CreateMsg
  317.  
  318.                               ; Mengen erstellen
  319.          mov di,offset ElementeFuerMenge1
  320.          mov cl,ElementeFuerMenge1_LENGTH
  321.          mov bx,offset BspMenge1
  322.          call Bilde_Menge
  323.  
  324.          mov di,offset ElementeFuerMenge2
  325.          mov cl,ElementeFuerMenge2_LENGTH
  326.          mov bx,offset BspMenge2
  327.          call Bilde_Menge
  328.  
  329.          mov bx,offset BspMenge2
  330.          mov di,offset BspMenge3
  331.          call Kopiere_Menge
  332.  
  333.          call ShowBSPMengen
  334.  
  335.          Write_String NegMsg
  336.          mov bx,offset BspMenge1
  337.          mov di,offset BspMenge2
  338.          call Negiere_Menge
  339.          call ShowBSPMengen
  340.  
  341.          Write_String ORMsg
  342.          mov bx,offset BspMenge1
  343.          mov di,offset BspMenge2
  344.          call Vereinige_Mengen
  345.          call ShowBSPMengen
  346.  
  347.          Write_String ANDMsg
  348.          mov bx,offset BspMenge1
  349.          mov di,offset BspMenge2
  350.          call Schneide_Mengen
  351.          call ShowBSPMengen
  352.  
  353.          Write_String XORMsg
  354.          mov bx,offset BspMenge1
  355.          mov di,offset BspMenge2
  356.          call XOR_Mengen
  357.          call ShowBSPMengen1
  358.          ret
  359.  
  360. ; ----------------------------
  361. ; ShowBSPMengen
  362. ;
  363. ; Funktion: Ausgabe der Beispielmengen und Restaurierung
  364. ;           der Menge BspMenge2
  365. ;
  366. ShowBSPMengen:
  367.          mov di,offset BspMenge1Msg
  368.          mov bx,offset BspMenge1
  369.          call Card_Menge
  370.          call Konvert_AL_TO_Dezstring
  371.          Write_String BspMenge1Msg
  372.          call ShowMenge
  373.  
  374.          mov di,offset BspMenge2Msg
  375.          mov bx,offset BspMenge2
  376.          call Card_Menge
  377.          call Konvert_AL_TO_Dezstring
  378.          Write_String BspMenge2Msg
  379.          call ShowMenge
  380.  
  381.          mov bx,offset BspMenge3
  382.          mov di,offset BspMenge2
  383.          call Kopiere_Menge
  384.  
  385.          call ShowPause
  386.          jnc >l1
  387.          add sp,2             ; Ret-Adresse vom Stack
  388.          ret                  ; und raus
  389. l1:
  390.  
  391. ShowBSPMengen1:
  392.          mov di,offset BspMenge1Msg
  393.          mov bx,offset BspMenge1
  394.          call Card_Menge
  395.          call Konvert_AL_TO_Dezstring
  396.          Write_String BspMenge1Msg
  397.          call ShowMenge
  398.  
  399.          mov di,offset BspMenge2Msg
  400.          mov bx,offset BspMenge2
  401.          call Card_Menge
  402.          call Konvert_AL_TO_Dezstring
  403.          Write_String BspMenge2Msg
  404.          call ShowMenge
  405.  
  406.          ret
  407.  
  408. ; ----------------------------
  409. ; ShowMenge
  410. ;
  411. ; Funktion: Gibt alle belegten Mengenelemente der bei Menge DS:BX
  412. ;           als ASCII-Zeichen auf die Standard-Ausgabe aus
  413. ;
  414. ShowMenge:
  415.          xor al,al
  416.          mov cx,256
  417. l0:
  418.          push cx
  419.          push ax
  420.          call Element_Vorhanden?
  421.          jz >l1
  422.          pop dx
  423.          push dx    
  424.                               ; Element ist vorhanden
  425.          mov ah,02h
  426.          int 021h             ; Zeichen ausgeben
  427.  
  428. l1:
  429.          pop ax
  430.          pop cx
  431.          inc al
  432.          loop l0
  433.  
  434.          call ShowCR_LF
  435.          ret
  436.  
  437.